#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <string>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QMessageBox>
#include <QFileDialog>
#include <QString>
#include <fstream>    // 支持std::ofstream
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);



    // 设置标题
    this->setWindowTitle("我的记事本");

    //方法一：menuBar()函数来实现
    //创建菜单栏
    QMenuBar* menubar = menuBar();
    //将菜单栏放入窗口中
    this->setMenuBar(menubar);

    // 方法二:在堆上动态创建；
    // QMenuBar* menuBar = new QMenuBar(this);
    // //将菜单栏放入窗口中
    // this->setMenuBar(menuBar);


    //2. 创建菜单
    QMenu* menu1 = new QMenu("文件");
    QMenu* menu2 = new QMenu("编辑");
    QMenu* menu3 = new QMenu("视图");
    QMenu* menu4 = new QMenu("构建");
    QMenu* menu5 = new QMenu("调试");

    //3. 添加菜单到菜单栏中
    menubar->addMenu(menu1);
    menubar->addMenu(menu2);
    menubar->addMenu(menu3);
    menubar->addMenu(menu4);
    menubar->addMenu(menu5);

    //4. 给菜单增加菜单项
    QAction* act1 = new QAction("open");
    QAction* act2 = new QAction("close");
    QAction* act3 = new QAction("save");
    QAction* act4 = new QAction("保存");
    QAction* act5 = new QAction("加载");
    menu1->addAction(act1);
    menu1->addSeparator(); ///在“open”和“close”中间添加分割线
    menu1->addAction(act2);
    menu1->addAction(act3);
    menu1->addAction(act4);
    menu1->addAction(act5);

    //给 action 添加信号槽， 上面的菜单项被点击后会产生一个 triggered 信号
    connect(act1, &QAction::triggered, this, &MainWindow::onOpen);
    connect(act2, &QAction::triggered, this, &MainWindow::onClose);
    connect(act3, &QAction::triggered, this, &MainWindow::onSave);

    connect(act4, &QAction::triggered, this, &MainWindow::save);
    connect(act5, &QAction::triggered, this, &MainWindow::load);

    // 创建中央控件
    edit = new QTextEdit(this);
    this->setCentralWidget(edit);
    edit->setPlaceholderText("此处编写⽂本内容...");
}

// 实现槽函数：处理"open"
void MainWindow::onOpen()
{
    if (isFileOpened) {
        QMessageBox::information(this, "提示", "已经打开了一个文件哦~");
    } else {
        isFileOpened = true;
        QMessageBox::information(this, "操作成功", "文件已打开！\n可以开始编辑啦~");
        // 实际应用中这里会添加打开文件对话框的代码
    }
}

// 实现槽函数：处理"close"
void MainWindow::onClose()
{
    if (!isFileOpened) {
        QMessageBox::warning(this, "提示", "没有打开的文件可关闭哦~");
    } else {
        isFileOpened = false;
        QMessageBox::information(this, "操作成功", "文件已关闭！");
        // 实际应用中这里会添加保存提示、清理资源的代码
    }
}

// 实现槽函数：处理"save"
void MainWindow::onSave()
{
    if (!isFileOpened) {
        QMessageBox::warning(this, "提示", "先打开文件才能保存哦~");
    } else {
        QMessageBox::information(this, "操作成功", "文件已保存！\n数据安全啦~");
        // 实际应用中这里会添加保存文件对话框、写入数据的代码
    }
}

void MainWindow::save()
{
    //弹出对话框，选择写入文件的路径
    QFileDialog* dialog = new QFileDialog(this);
    QString fileName = dialog->getSaveFileName(this, "保存文件", "D:/CSDN/my-qt/QtMainWindow/Qt_MianWindow_1");
    qDebug() << "fileName: " << fileName;

    //写入文件
    std::ofstream file(fileName.toStdString().c_str());
    if (!file.is_open()) {
        qDebug() << "文件保存失败！无法打开文件";
        return;
    }
    const QString& text = edit->toPlainText();  // 现在edit是成员变量，可访问
    file << text.toStdString();
    file.close();  // 显式关闭文件（可选，析构时会自动关闭）

    qDebug() << "文件保存成功！";
}

void MainWindow::load()
{
    //弹出对话框，选择写入文件的路径
    QFileDialog* dialog = new QFileDialog(this);
    QString fileName = dialog->getOpenFileName(this, "加载⽂件", "D:/CSDN/my-qt/QtMainWindow/Qt_MianWindow_1");
    qDebug() << "fileName: " << fileName;

    //写入文件
    std::ifstream file(fileName.toStdString().c_str());
    if(!file.is_open())
    {
        qDebug() << "文件加载失败！";
        return;
    }

    std::string content;
    std::string line;
    while(std::getline(file, line))
    {
        content += line;
        content += "\n";
    }
    file.close();

    //显示到界面上
    QString text = QString::fromStdString(content);
    edit->setPlainText(text);
}

MainWindow::~MainWindow()
{
    delete ui;
}
